package com.ruoyi.system.service.aggregation.impl;

import java.util.List;
import java.math.BigDecimal;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.mapper.aggregation.MerchantProfitConfigMapper;
import com.ruoyi.system.domain.aggregation.MerchantProfitConfig;
import com.ruoyi.system.service.aggregation.IMerchantProfitConfigService;

/**
 * 商家个性化分润配置Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-01-10
 */
@Service
public class MerchantProfitConfigServiceImpl implements IMerchantProfitConfigService 
{
    @Autowired
    private MerchantProfitConfigMapper merchantProfitConfigMapper;

    /**
     * 查询商家个性化分润配置
     * 
     * @param id 商家个性化分润配置主键
     * @return 商家个性化分润配置
     */
    @Override
    public MerchantProfitConfig selectMerchantProfitConfigById(Long id)
    {
        return merchantProfitConfigMapper.selectMerchantProfitConfigById(id);
    }

    /**
     * 根据商家ID查询分润配置
     * 
     * @param merchantId 商家ID
     * @return 商家个性化分润配置
     */
    @Override
    public MerchantProfitConfig selectMerchantProfitConfigByMerchantId(Long merchantId)
    {
        return merchantProfitConfigMapper.selectMerchantProfitConfigByMerchantId(merchantId);
    }

    /**
     * 查询商家个性化分润配置列表
     * 
     * @param merchantProfitConfig 商家个性化分润配置
     * @return 商家个性化分润配置
     */
    @Override
    public List<MerchantProfitConfig> selectMerchantProfitConfigList(MerchantProfitConfig merchantProfitConfig)
    {
        return merchantProfitConfigMapper.selectMerchantProfitConfigList(merchantProfitConfig);
    }

    /**
     * 新增商家个性化分润配置
     * 
     * @param merchantProfitConfig 商家个性化分润配置
     * @return 结果
     */
    @Override
    public int insertMerchantProfitConfig(MerchantProfitConfig merchantProfitConfig)
    {
        // 验证分润比例
        if (!validateProfitRates(merchantProfitConfig)) {
            throw new RuntimeException("分润比例验证失败，各比例之和必须等于100%");
        }

        // 检查商家是否已有配置
        if (merchantProfitConfigMapper.checkMerchantConfigExists(merchantProfitConfig.getMerchantId()) > 0) {
            throw new RuntimeException("该商家已存在分润配置，请使用修改功能");
        }

        merchantProfitConfig.setCreateTime(DateUtils.getNowDate());
        merchantProfitConfig.setCreateBy(SecurityUtils.getLoginName());
        return merchantProfitConfigMapper.insertMerchantProfitConfig(merchantProfitConfig);
    }

    /**
     * 修改商家个性化分润配置
     * 
     * @param merchantProfitConfig 商家个性化分润配置
     * @return 结果
     */
    @Override
    public int updateMerchantProfitConfig(MerchantProfitConfig merchantProfitConfig)
    {
        // 验证分润比例
        if (!validateProfitRates(merchantProfitConfig)) {
            throw new RuntimeException("分润比例验证失败，各比例之和必须等于100%");
        }

        merchantProfitConfig.setUpdateTime(DateUtils.getNowDate());
        merchantProfitConfig.setUpdateBy(SecurityUtils.getLoginName());
        return merchantProfitConfigMapper.updateMerchantProfitConfig(merchantProfitConfig);
    }

    /**
     * 批量删除商家个性化分润配置
     * 
     * @param ids 需要删除的商家个性化分润配置主键
     * @return 结果
     */
    @Override
    public int deleteMerchantProfitConfigByIds(Long[] ids)
    {
        return merchantProfitConfigMapper.deleteMerchantProfitConfigByIds(ids);
    }

    /**
     * 删除商家个性化分润配置信息
     * 
     * @param id 商家个性化分润配置主键
     * @return 结果
     */
    @Override
    public int deleteMerchantProfitConfigById(Long id)
    {
        return merchantProfitConfigMapper.deleteMerchantProfitConfigById(id);
    }

    /**
     * 审核商家分润配置
     * 
     * @param merchantProfitConfig 审核信息
     * @return 结果
     */
    @Override
    public int auditMerchantProfitConfig(MerchantProfitConfig merchantProfitConfig)
    {
        merchantProfitConfig.setAuditUserId(SecurityUtils.getUserId());
        merchantProfitConfig.setUpdateTime(DateUtils.getNowDate());
        merchantProfitConfig.setUpdateBy(SecurityUtils.getLoginName());
        return merchantProfitConfigMapper.auditMerchantProfitConfig(merchantProfitConfig);
    }

    /**
     * 为商家创建默认分润配置
     * 
     * @param merchantId 商家ID
     * @param merchantName 商家名称
     * @return 结果
     */
    @Override
    public int createDefaultConfigForMerchant(Long merchantId, String merchantName)
    {
        // 检查是否已存在配置
        if (merchantProfitConfigMapper.checkMerchantConfigExists(merchantId) > 0) {
            return 0; // 已存在，不重复创建
        }

        MerchantProfitConfig config = new MerchantProfitConfig();
        config.setMerchantId(merchantId);
        config.setMerchantName(merchantName);

        // 设置默认异业联盟分润比例
        config.setInterIndustryTotalRate(new BigDecimal("10.00")); // 总提点10%
        config.setInterIndustryMerchantRate(new BigDecimal("80.00")); // 商家80%
        config.setInterIndustrySalesmanRate(new BigDecimal("10.00")); // 业务员10%
        config.setInterIndustryRegionRate(new BigDecimal("5.00")); // 区域代理5%
        config.setInterIndustryCompanyRate(new BigDecimal("5.00")); // 总公司5%

        // 设置默认广告收益分润比例
        config.setAdTotalRate(new BigDecimal("100.00")); // 广告总收益100%
        config.setAdMerchantRate(new BigDecimal("30.00")); // 商家30%
        config.setAdUserRate(new BigDecimal("40.00")); // 用户40%
        config.setAdSalesmanRate(new BigDecimal("15.00")); // 业务员15%
        config.setAdRegionRate(new BigDecimal("10.00")); // 区域代理10%
        config.setAdCompanyRate(new BigDecimal("5.00")); // 总公司5%

        // 设置默认门店配置
        config.setStoreType("normal");
        config.setStoreBonusRate(BigDecimal.ZERO);
        config.setMinOrderAmount(BigDecimal.ZERO);
        config.setMaxDailyLimit(BigDecimal.ZERO);

        // 设置默认广告奖励配置
        config.setAdRewardMinDuration(30); // 最小观看30秒
        config.setAdRewardCompleteRequired(true); // 必须看完
        config.setAdRewardDailyLimit(10); // 每日最多10次
        config.setAdRewardAmountPerView(new BigDecimal("0.01")); // 每次0.01元

        // 设置默认用户锁定配置
        config.setUserLockEnabled(true); // 启用锁定
        config.setLockUserLimit(0); // 无限制
        config.setLockDurationDays(365); // 锁定1年

        // 设置状态
        config.setStatus(1); // 启用
        config.setAuditStatus(1); // 默认通过审核

        config.setCreateTime(DateUtils.getNowDate());
        config.setCreateBy("system");
        config.setUpdateTime(DateUtils.getNowDate());
        config.setUpdateBy("system");

        return merchantProfitConfigMapper.insertMerchantProfitConfig(config);
    }

    /**
     * 验证分润比例总和
     * 
     * @param config 分润配置
     * @return 验证结果
     */
    @Override
    public boolean validateProfitRates(MerchantProfitConfig config)
    {
        // 验证异业联盟分润比例
        if (config.getInterIndustryMerchantRate() != null &&
            config.getInterIndustrySalesmanRate() != null &&
            config.getInterIndustryRegionRate() != null &&
            config.getInterIndustryCompanyRate() != null) {
            
            BigDecimal total = config.getInterIndustryMerchantRate()
                .add(config.getInterIndustrySalesmanRate())
                .add(config.getInterIndustryRegionRate())
                .add(config.getInterIndustryCompanyRate());
            
            if (total.compareTo(new BigDecimal("100.00")) != 0) {
                return false;
            }
        }

        // 验证广告收益分润比例
        if (config.getAdMerchantRate() != null &&
            config.getAdUserRate() != null &&
            config.getAdSalesmanRate() != null &&
            config.getAdRegionRate() != null &&
            config.getAdCompanyRate() != null) {
            
            BigDecimal total = config.getAdMerchantRate()
                .add(config.getAdUserRate())
                .add(config.getAdSalesmanRate())
                .add(config.getAdRegionRate())
                .add(config.getAdCompanyRate());
            
            if (total.compareTo(new BigDecimal("100.00")) != 0) {
                return false;
            }
        }

        return true;
    }

    /**
     * 获取商家异业联盟分润配置
     * 
     * @param merchantId 商家ID
     * @return 分润配置
     */
    @Override
    public MerchantProfitConfig getInterIndustryConfig(Long merchantId)
    {
        MerchantProfitConfig config = selectMerchantProfitConfigByMerchantId(merchantId);
        if (config == null) {
            // 如果没有配置，返回默认配置
            config = new MerchantProfitConfig();
            config.setInterIndustryTotalRate(new BigDecimal("10.00"));
            config.setInterIndustryMerchantRate(new BigDecimal("80.00"));
            config.setInterIndustrySalesmanRate(new BigDecimal("10.00"));
            config.setInterIndustryRegionRate(new BigDecimal("5.00"));
            config.setInterIndustryCompanyRate(new BigDecimal("5.00"));
        }
        return config;
    }

    /**
     * 获取商家广告收益分润配置
     * 
     * @param merchantId 商家ID
     * @return 分润配置
     */
    @Override
    public MerchantProfitConfig getAdRevenueConfig(Long merchantId)
    {
        MerchantProfitConfig config = selectMerchantProfitConfigByMerchantId(merchantId);
        if (config == null) {
            // 如果没有配置，返回默认配置
            config = new MerchantProfitConfig();
            config.setAdTotalRate(new BigDecimal("100.00"));
            config.setAdMerchantRate(new BigDecimal("30.00"));
            config.setAdUserRate(new BigDecimal("40.00"));
            config.setAdSalesmanRate(new BigDecimal("15.00"));
            config.setAdRegionRate(new BigDecimal("10.00"));
            config.setAdCompanyRate(new BigDecimal("5.00"));
        }
        return config;
    }
}
